#ifndef WRMNKRSTWRAPPER_H
#define WRMNKRSTWRAPPER_H

#include "RmnkSolver.h"

#include <boost/smart_ptr.hpp>

// Przestrzeń nazw
namespace RafMat
{
namespace SimEngine
{

class WrmnkRSTWrapper;

typedef boost::shared_ptr<WrmnkRSTWrapper> WrmnkRSTWrapperSPtr;

class WrmnkRSTWrapper
{
public:
    typedef RmnkSolver::SampleMemory SampleMemory;
    typedef RmnkSolver::Matrix Matrix;

    WrmnkRSTWrapper(unsigned dA, unsigned dB, unsigned dly);

    void identify(double inSample, double outSample);

    void reset();

    const Polynomial& getEstimatedA() const { return m_estimatedA; }
    const Polynomial& getEstimatedB() const { return m_estimatedB; }
    unsigned int getDelay() const { return m_delay; }

private:
    RmnkSolverSPtr m_wrmnk;

    unsigned int m_dA;
    unsigned int m_dB;
    unsigned int m_rankSum;
    unsigned int m_delay;

    Polynomial m_estimatedA;
    Polynomial m_estimatedB;

    SampleMemory m_outmem;          ///< Pamięć dla próbek wyjściowych.
    SampleMemory m_inmem;           ///< Pamięć dla próbek wejściowych.

    Matrix m_varphi;                ///< Wektor dla alg. identyfikacji
    Matrix m_theta;                 ///< Wektor szukanych parametrów..
};

}
}

#endif // WRMNKRSTWRAPPER_H
